"use strict";
//⽅法装饰器
//基本语法
/*
 参数说明：
 ○ target: 对于静态⽅法来说值是类，对于实例⽅法来说值是原型对象。
 ○ propertyKey:⽅法的名称。
 ○ descriptor: ⽅法的描述对象，其中value属性是被装饰的⽅法。
*/
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
/*
 参数说明：
 ○ target: 对于静态⽅法来说值是类，对于实例⽅法来说值是原型对象。
 ○ propertyKey:⽅法的名称。
 ○ descriptor: ⽅法的描述对象，其中value属性是被装饰的⽅法。
*/
function Demo(target, propertyKey, descriptor) {
    console.log(target);
    console.log(propertyKey);
    console.log(descriptor);
}
class Person22 {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    // Demo装饰实例⽅法
    speak() {
        console.log(`你好，我的名字：${this.name}，我的年龄：${this.age}`);
    }
    // Demo装饰静态⽅法
    static isAdult(age) {
        return age >= 18;
    }
}
__decorate([
    Demo
], Person22.prototype, "speak", null);
__decorate([
    Demo
], Person22, "isAdult", null);
//应⽤举例
// 需求：
//   1. 定义⼀个 Logger ⽅法装饰器，⽤于在⽅法执⾏前和执⾏后，均追加⼀些额外逻辑。
//   2. 定义⼀个 Validate ⽅法装饰器，⽤于验证数据。
function Logger(target, propertyKey, descriptor) {
    //存储原始方法
    const originnal = descriptor.value;
    // 替换原始⽅法
    descriptor.value = function (...args) {
        console.log(`${propertyKey}开始执⾏......`);
        const result = originnal.call(this, ...args);
        console.log(`${propertyKey}执⾏完毕......`);
        return result;
    };
}
//装饰器工厂
function Validate(maxValue) {
    return function (target, propertyKey, descriptor) {
        // 保存原始⽅法
        const original = descriptor.value;
        // 替换原始⽅法
        descriptor.value = function (...args) {
            // ⾃定义的验证逻辑
            if (args[0] > maxValue) {
                throw new Error('年龄⾮法！');
            }
            // 如果所有参数都符合要求，则调⽤原始⽅法
            return original.apply(this, args);
        };
    };
}
class Person23 {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    //AOP
    speak(str) {
        console.log(`你好，我的名字：${this.name}，我的年龄：${this.age}，----${str}`);
    }
    static isAdult(age) {
        return age >= 18;
    }
}
__decorate([
    Logger
], Person23.prototype, "speak", null);
__decorate([
    Validate(18)
], Person23, "isAdult", null);
const p23 = new Person23("漳卅", 18);
p23.speak("xxxxxxxxxxxxxx");
console.log(Person23.isAdult(19));
